package com.msi.algorithm;

import java.util.ArrayList;
import java.util.List;

import com.msi.Graph;
import com.msi.Vertex;

/**
 * Stół do obsadzenia gośćmi
 * 
 * @author Michał Kołodziejski
 */
public class Table {

    protected List<Vertex> sittingGuests;

    /**
     * Tworzy nowy pusty stół
     */
    public Table() {
        sittingGuests = new ArrayList<Vertex>();
    }

    /**
     * Zwraca informację, czy nowy gość może dosiąść się do tego stołu
     * 
     * @param newGuest
     *            nowy gość
     * @return informacja, czy nowy gość może dosiąść się do tego stołu
     */
    public boolean maySeatHere(Vertex newGuest) {
        if (sittingGuests.size() >= 4) {
            return false;
        }

        if (sittingGuests.size() == 0) {
            return true;
        }

        boolean allGuestsKnown = true;
        for (Vertex guest : sittingGuests) {
            boolean newGuestKnown = false;
            for (Vertex friend : guest.getNeighborhood()) {
                if (friend.equals(newGuest)) {
                    newGuestKnown = true;
                    break;
                }
            }

            allGuestsKnown = allGuestsKnown && newGuestKnown;
            if (allGuestsKnown == false) {
                break;
            }
        }

        return allGuestsKnown;
    }

    /**
     * Sadza gościa przy tym stole. Wymaga to wcześniejszego sprawdzenia!
     * 
     * @param newGuest
     *            nowy gość
     */
    public void sitHere(Vertex newGuest) {
        sittingGuests.add(newGuest);
    }

    /**
     * Zwraca liczbę gości siedzących przy tym stole
     * 
     * @return liczba gości siedzących przy tym stole
     */
    public int getNumberOfSittingGuests() {
        return sittingGuests.size();
    }

    /**
     * Zwraca kopię stołu z odpowiadającymi wierzchołkami z kopii grafu
     * 
     * @param graph
     *            kopia grafu
     * @return kopia stołu
     */
    public Table getTableCopy(Graph graph) {
        Table tableCopy = new Table();
        for (Vertex guest : sittingGuests) {
            tableCopy.sitHere(graph.getVertex(guest.getId()));
        }
        return tableCopy;
    }

    /**
     * Zwraca listę gości siedzących przy stole
     * 
     * @return lista gości
     */
    public List<Vertex> getListOfSittingGuests() {
        return sittingGuests;
    }
}
